package com.atguigu.cloud.response;

import lombok.Getter;

import java.util.Arrays;

/**
 * 响应码枚举
 * 定义一个通用的枚举类：举值-构造-遍历
 */
@Getter
public enum ResponseCodeEnum {
    // 1.举值
    /**
     * 操作成功
     **/
    RC200(200, "success"),
    /**
     * 服务降级
     **/
    // RC201(201, "服务开启降级保护,请稍后再试!"),
    RC201(201, "创建成功"),
    /**
     * 热点参数限流
     **/
    RC202(202, "热点参数限流,请稍后再试!"),
    /**
     * 系统规则不满足
     **/
    RC203(203, "系统规则不满足要求,请稍后再试!"),
    /**
     * 授权规则不通过
     **/
    // RC204(204, "授权规则不通过,请稍后再试!"),
    RC204(204, "删除成功"),
    /**
     * 参数校验异常
     **/
    RC400(400, "参数校验异常"),
    /**
     * 未授权
     **/
    RC401(401, "匿名用户访问无权限资源时的异常"),
    /**
     * 用户未登录
     **/
    RC402(402, "用户未登录"),
    /**
     * 无访问权限
     **/
    RC403(403, "无访问权限,请联系管理员授予权限"),
    /**
     * 请求路径不存在
     **/
    RC404(404, "404页面找不到的异常"),
    /**
     * 请求方法不允许
     **/
    RC405(405, "请求方式错误"),
    /**
     * 请求超时
     **/
    RC408(408, "请求超时"),
    /**
     * 服务异常
     **/
    RC500(500, "系统异常，请稍后重试"),
    RC502(502, "网关异常，请稍后重试"),
    RC503(503, "服务不可用，请稍后重试"),
    RC504(504, "网关超时，请稍后重试"),
    RC375(375, "数学运算异常，请稍后重试"),
    /**
     * 操作失败
     **/
    RC999(999, "操作XXX失败"),

    /**
     * 自定义错误码
     */
    CLIENT_AUTHENTICATION_FAILED(1001, "客户端认证失败"),
    USERNAME_OR_PASSWORD_ERROR(1002, "用户名或密码错误"),
    BUSINESS_ERROR(1004, "业务逻辑异常"),
    UNSUPPORTED_GRANT_TYPE(1003, "不支持的认证模式"),
    INVALID_TOKEN(2001, "访问令牌不合法"),
    ACCESS_DENIED(2003, "没有权限访问该资源");

    // 2.构造
    /**
     * 响应码
     */
    private final Integer code;
    /**
     * 响应信息
     */
    private final String message;

    /**
     * 构造器
     *
     * @param code    状态码
     * @param message 响应信息
     */
    ResponseCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    // 3.遍历

    /**
     * 根据code查找对应的枚举
     *
     * @param code 状态码
     * @return 枚举值
     */
    public static ResponseCodeEnum getResponseCodeEnum(Integer code) {
        return Arrays.stream(ResponseCodeEnum.values()).filter(item -> item.getCode().equals(code)).findFirst().orElse(null);
    }
}
